package hyl.base.cache2;

import java.util.Map;

import hyl.core.MyFun;

/**
 * 可过期令牌对象
 * 
 * 集成了 ACValue 和 ExpValue 的 次数控制和过期控制两个特点
 * 
 * 只有一个值 就是id
 * 
 * 最多 24.5天,如果需要延长,自行更新时间戳 upStamp()
 * 
 * 如果24天内系统故障 所有token都会丢失
 * 
 * 默认 可以使用1次
 * 
 * @author 37798955@qq.com
 *
 */
public class ExToken {
	protected String id;
	/**
	 * 启用时间戳
	 */
	long stamp = 0;
	/**
	 * 毫秒为单位 默认是3s ,
	 * 
	 * 
	 */
	int ms过期时长 = 3000;
	public static final int I无限次 = -1;
	/**
	 * -1 无限使用 0 表示无法使用 >0 使用次数 通过exec 减一
	 */
	int i可用次数 = 1;
	public Map<String, Object> _附件 = null;

	public ExToken() {
		id = MyFun.getUUID();
		stamp = MyFun.getMs();
	}

	public ExToken(int 过期时长ms) {
		id = MyFun.getUUID();
		stamp = MyFun.getMs();
		ms过期时长 = 过期时长ms;
	}

	public ExToken(String 令牌) {
		id = 令牌;
		stamp = MyFun.getMs();
	}

	public ExToken(String 令牌, int 过期时长ms) {
		id = 令牌;
		stamp = MyFun.getMs();
		ms过期时长 = 过期时长ms;
	}

	public ExToken(String 令牌, long 时间戳, int 过期时长ms) {
		id = 令牌;
		stamp = 时间戳;
		ms过期时长 = 过期时长ms;
	}

	public int getMs过期时长() {
		return ms过期时长;
	}

	public void setMs过期时长(int ms过期时长) {
		this.ms过期时长 = ms过期时长;
	}

	/**
	 * 每调用一次就减一,
	 * 
	 * @return
	 */
	public int exec() {
		if (this.i可用次数 > 0)
			this.i可用次数--;
		return this.i可用次数;
	}

	public void setId(String token) {
		this.id = token;
	}

	public boolean is可用() {
		return i可用次数 != 0;
	}

	public int getI可用次数() {
		return i可用次数;
	}

	public void setI可用次数(int count) {
		this.i可用次数 = count;
	}

	public String getId() {
		return id;
	}

	public void setStamp(long stamp) {
		this.stamp = stamp;
	}

	/**
	 * 更新时间戳 为最新
	 */
	public void upStamp() {
		this.stamp = MyFun.getMs();
	}

	public long getStamp() {
		return stamp;
	}

	public String getStampstr() {
		return String.valueOf(stamp);
	}

	public String toString() {
		return MyFun.join2(",", id, stamp, ms过期时长, i可用次数);
	}

	public boolean is有效() {
		long now = MyFun.getMs();
		return (now < stamp + ms过期时长) && i可用次数 != 0;
	}

}
